package com.xjh.basestudy.designmode.structureMode.structureMode5_FlyWeight.p2_flyweight;

import java.util.HashMap;
import java.util.Map;

/**
 * @author XuJianHua
 * @date 2022-09-26 11:45:04
 * @description 享元模式工厂-创建一个图库，如果请求时，图库中没有就重新创建，加入到图库中，如果有，则直接从图库中获取
 * *，图件工厂类类似于一个图库管理器，其中维护着所有的图件元对象。首先在第5行的构造方法中初始化一个散列图的“缓存池”，然后通过懒加载模式来维护它。
 * * 当客户端调用第9行的获取图件方法getDrawable()时，程序首先会判断目标图件是否已经实例化并存在于缓存池中，
 * * 如果没有则实例化并放入图库缓存池供下次使用，到这里目标图件必然存在于缓存池中了。
 * * 最后在第28行直接从缓存池中获取目标图件并返回。如此，无论外部需要什么图件，也无论外部获取多少次图件，
 * * 每类图件都只会在内存中被加载一次，这便是“元共享”的秘密所在。
*
 */
public class TileFactory {

    private Map<String, Drawable> images;//图库

    public TileFactory() {
        images = new HashMap<String, Drawable>();
    }

    public Drawable getDrawable(String image) {
        //缓存池里如果没有图件，则实例化并放入缓存池
        if(!images.containsKey(image)){
            switch (image) {
                case "河流":
                    images.put(image, new River());
                    break;
                case "草地":
                    images.put(image, new Grass());
                    break;
                case "道路":
                    images.put(image, new Road());
                    break;
                case "房屋":
                    images.put(image, new House());
            }
        }

        //至此，缓存池里必然有图件，直接取得并返回
        return images.get(image);
    }

}